//
//  recursion.cpp
//  learnC++
//
//  Created by apple on 2018/6/1.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#include "recursion.hpp"


void countDown(int count)
{
    std::cout << "push " << count << '\n';
    
    if (count > 1) // termination condition
        countDown(count-1);
    
    std::cout << "pop " << count << '\n';
}

//斐波那契数列
int fibonacci(int number)
{
    if (number == 0)
        return 0; // base case (termination condition)
    if (number == 1)
        return 1; // base case (termination condition)
    return fibonacci(number-1) + fibonacci(number-2);
}

void test_recursion(){
//    由于终止条件，countDown（1）不会调用countDown（0） - 相反，“if语句”不会执行，因此它会打印“pop 1”，然后终止。 此时，countDown（1）从堆栈弹出，控制返回到countDown（2）。 countDown（2）在调用countDown（1）后的点恢复执行，因此它会打印“pop 2”，然后终止。 递归函数调用随后从堆栈中弹出，直到countDown的所有实例都被删除。
    
//    因此，这个计划的总产出：
//    push 5
//    push 4
//    push 3
//    push 2
//    push 1
//    pop 1
//    pop 2
//    pop 3
//    pop 4
//    pop 5
    
//    countDown(5);
    
    for (int count=0; count < 13; ++count){
        std:: cout << fibonacci(count) << " ";
    }
    
}

